//
// Created by 孙凌霄 on 2021/6/29.
//

// 线程
#include <thread>
#include <pthread.h>
#include <iostream>
#include <queue>

using namespace std;

// 线程任务
void *pThreadTask(void *args) {
    // 获取参数
    int i = *static_cast<int *>(args);
    cout << "thread start:" << i << endl;
    return nullptr;
}

// posix线程
void testPThread1() {
    pthread_t pid;
    // 线程属性
    pthread_attr_t attr;
    // 默认为非分离线程(允许线程可以被其他线程操作，如等待等)
    // 设置分离线程，join失效
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    pthread_attr_init(&attr);
    int i = 100;
    // 参数二：线程属性
    pthread_create(&pid, &attr, pThreadTask, &i);

    // 等待线程执行完毕，在执行main，如果设置为分离线程，则不等待
    pthread_join(pid, nullptr);

    // 释放线程属性
    pthread_attr_destroy(&attr);
    cout << "thread run end" << endl;
}

queue<int> q;
// 互斥锁,是悲观锁
pthread_mutex_t mylock;

void *queue_task(void *args) {
    // 取数据加锁
    pthread_mutex_lock(&mylock);
    if (!q.empty()) {
        printf("queue front=%d\n", q.front());
        q.pop();
    } else {
        printf("queue is empty");
    }
    // 读取完毕解锁
    pthread_mutex_unlock(&mylock);
    return nullptr;
}

// 线程同步
void threadAsync() {
    // 使用互斥锁
    pthread_mutex_init(&mylock, nullptr);
    for (int i = 0; i < 5; i++) {
        q.push(i);
    }

    // 创建10个线程
    pthread_t pids[10];
    for (auto &pid : pids) {
        pthread_create(&pid, nullptr, queue_task, nullptr);
    }

    // 释放销毁互斥锁
    pthread_mutex_destroy(&mylock);
}

int main() {
    // testPThread1();
    threadAsync();
    return 0;
}